// od descrypt
// crime[DFS递归字符组合可重复选]全排列full_Permutation/不重复选的全排列next_permutation
// https://blog.csdn.net/weixin_44224529/article/details/117932485
// 解密犯罪时间 | 时间限制：1秒 | 内存限制：262144K | 语言限制：不限
// 警察在侦破一个案件时，得到了线人给出的可能犯罪时间，形如 HH:MM 表示的时刻。
// 根据警察和线人的约定，为了隐蔽，该时间是修改过的，解密规则为：利用当前出现过的数字，
// 构造下一个距离当前时间最近的时刻，则该时间为可能的犯罪时间。每个出现数字都可以被无限次使用
// 输入形如HH:SS的字符串，表示原始输入
// 输出形如HH:SS的字符串，表示推理出来的犯罪时间
// 输入18:52
// 输出18:55
// 利用数字1,8,5,2构造出来的最近时刻是18:55，是3分钟之后。结果不是18:51因为这个时刻是18小时52分钟之后。
// 输入 23:59
// 输出 22:22
// 利用数字2,3,5,9构造出来的最近时刻是22:22
// 答案一定是第二天的某一时刻，所以选择可构造的最小时刻为犯罪时间
// 可以保证线人给定的字符串一定是合法的。例如，01:35 和 11:08 是合法的，1:35 和
// 11:8 是不合法的 最近的时刻有可能在第二天
// ============
//已知字符串里的字符是互不相同的，现在任意组合，比如ab，则输出aa，ab，ba，bb，编程按照字典序输出所有的组合。
//本题可用递归的思想，设置一个变量表示已输出的个数，然后当个数达到字符串长度时，就输出。
// 111
// 112
// 113
// 121
// 122
// 123
// 131
//...

#include <bits/stdc++.h>
using namespace std;

#define DEBUG_
#ifdef DEBUG_
#define PF(...) printf(__VA_ARGS__)
#define FRE(x)                    \
  freopen("d:/oj/" #x ".in", "r", \
          stdin)  //,freopen("d:/oj/"#x".out","w",stdout)
#define FREC fclose(stdin), fclose(stdout);
#else
#define PF(...)
#define FRE(x)
#define FREC
#endif

const static int MAX_VAL = 0X5fffffff;
int getMinute(string sTime) {
  int hour = 0, minute = 0;
  sscanf(sTime.c_str(), "%2d%2d", &hour, &minute);
  if (hour > 23 || minute > 59) {
    return MAX_VAL;
  }
  return (hour * 60) + minute;
}

string findTime(string srcTime, const set<string>& stTime) {
  int time1 = getMinute(srcTime);

  int i = 0;
  int nMinDiff = MAX_VAL;
  string res;
  for (auto newti : stTime) {
    int time2 = getMinute(newti);
    int nDiff1 = time2 - time1;
    if (nDiff1 > 0 && nDiff1 < nMinDiff) {
      nMinDiff = nDiff1;
      res = newti;
    }
    int nDiff2 = 24 * 60 + time2 - time1;
    if (nDiff2 > 0 && nDiff2 < nMinDiff) {
      nMinDiff = nDiff2;
      res = newti;
    }
    // PF("%d,%s,  %d,%d\n",i,newti.c_str(),nDiff1,nDiff2);
    i++;
  }
  return res;
}

void dfsPermutation(const string& src, string& path, vector<string>& ans) {
  if (path.length() == src.length()) {
    ans.push_back(path);
    return;
  }
  for (size_t j = 0; j < src.length(); j++) {
    path.push_back(src[j]);
    dfsPermutation(src, path, ans);
    path.pop_back();
  }
}

string getLastCrimeTime(const string& srcTime) {
  string src(srcTime);
  src.erase(src.find(':'), 1);
  // 全排列
  string path;
  vector<string> vtAll;
  dfsPermutation(src, path, vtAll);
  //去重
  set<string> stTime;
  for (auto s : vtAll) stTime.insert(s);
  return findTime(src, stTime);
}

int main() {
  string s = "18:52";
  while (cin >> s) {
    string s2 = getLastCrimeTime(s);
    printf("%s\n", s2.insert(2, ":").c_str());
  }
  return 0;
}
